﻿#pragma once
#ifndef WRAPPSERVICE_H
#define WRAPPSERVICE_H

#include "WRType.h"

//应用程序服务类型标识 {07E4C82E-A4F1-4147-8DE1-52A3C9E38405}
#define WRAppServiceType QUuid(0x7e4c82e, 0xa4f1, 0x4147, 0x8d, 0xe1, 0x52, 0xa3, 0xc9, 0xe3, 0x84, 0x5)

namespace WRTypes
{
    //获取应用程序服务类型。
    WRSOFT_UTILITY_API WRType* appService(void);
}

//表示应用程序服务。
class WRAppService
{
    friend class WRAppContext;

private:
    //禁用复制构造函数和赋值操作符。
    Q_DISABLE_COPY(WRAppService)

protected:
    //初始化应用程序服务。
    inline WRAppService(void)
    {
        //add code here
    }
    //释放当前对象所占用的相关资源。
    virtual ~WRAppService(void)
    {
        //add code here
    }

public:
    //获取当前对象类型。
    virtual WRType* type(void) const = 0;

    //识别当前对象是否是指定类型标识对象的实例。
    inline bool identify(const QUuid& tuid) const
    {
        WRType* type = this->type();
        while(type)
        {
            if (type->uuid() == tuid)
            {
                return true;
            }
            type = type->base();
        }
        return false;
    }
    //识别当前对象是否是指定类型对象的实例。
    inline bool identify(WRType* type) const
    {
        if (type)
        {
            WRType* type2 = this->type();
            while(type2)
            {
                if (type2 == type)
                {
                    return true;
                }
                type2 = type2->base();
            }
        }
        return false;
    }
};

#endif // WRAPPSERVICE_H
